# -*- coding: utf-8 -*-
# @File  : Process_lock.py
# @Author: zbh
# @Date  : 2025/2/24_15:01


# 使用multiprocessing.Lock()方法创建一个互斥锁，互斥锁可以保证在同一时间只有一个进程可以访问共享资源。
# 在生产者和消费者函数中，使用lock.acquire()方法获取锁，使用lock.release()方法释放锁。
# 这样可以确保在生产者和消费者之间的访问是互斥的，避免了数据竞争和不一致的情况。
'''
使用多进程时，各个进程拥有独立的共享空间，无法共享内存空间，所以各进程无法访问同一个全局变量，
如果需要各个进程共享某个全局变量，可以使用
1. multiprocessing.Value()或者multiprocessing.Array()或者multiprocessing.Manager().list()
或者multiprocessing.Manager.dict()来创建共享变量；
'''


'''如果进程锁获取后不释放，后续需要获取该锁的进程会在尝试获取锁时被阻塞，无法执行受该锁保护的关键代码段，
但进程本身可以继续执行其他不受该锁影响的代码。为了避免死锁和资源浪费，在使用进程锁时，
一定要确保在适当的时候调用 lock.release() 方法释放锁。
可以使用 with 语句来自动管理锁的获取和释放，这样可以避免手动释放锁时可能出现的错误
在 with 语句块结束时，锁会自动被释放。
'''


import multiprocessing
import time
import random
import os

def work_func(lock,shared_var):
    for i in range(2):
        lock.acquire()  # 获取锁
        print("进程：{},已经获取锁".format(multiprocessing.current_process().name))  # 获取锁，用于进程同步
        n = random.randint(0,5) # 随机生成一个数
        shared_var.value += n  # 修改共享变量
        time.sleep(random.randint(0,1)) # 模拟耗时操作
        # shared_var.value -= n  # 修改共享变量
        print("进程{}里面查看shared_var.value是{}".format(multiprocessing.current_process().name,shared_var.value))
        # lock.release()  # 释放锁
        print("进程：{} 释放锁".format(multiprocessing.current_process().name))

def main():
    process_list = []
    lock = multiprocessing.Lock() # 创建一个锁
    shared_var = multiprocessing.Value('i',0) # 创建一个共享变量,i，表示整数，还可以是d浮点数；0表示初始值
    print("本级cpu核数：{} 核。".format(os.cpu_count()))
    for i in range(3):
        t = multiprocessing.Process(target=work_func,args=(lock,shared_var))  # 创建一个进程,将锁和共享变量作为参数传递给进程函数
        process_list.append(t)  # 将进程添加到进程列表中
        t.start()  # 启动进程
        for t in process_list:
            t.join()  # 等待进程结束

if __name__ == "__main__":
    main()









